数据排序

有时需要对数据进行排序,可以根据单个条件排序,也可以根据多个条件进行排序。可以从小到大升序排列,也可以从大到小降序排列。

单条件排序

【问题描述】

根据DataFrame中的单列数据对行数据进行排序。

【示例3-31】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/05 数据排序/单条件排序/身份证号-排序.xlsx”。该文件打开后如图3-22所示,是一些工作人员的身份信息。请根据工号对数据进行升序排序。

Document Image

图3-22 人员身份信息

  • 编写下面的代码:
code.python
import pandas as pd
# 读取Excel文件到DataFrame
df = pd.read_excel('D:/Samples/ch03/05 数据排序/单条件排序/身份证号-排序.xlsx', engine='openpyxl')
# 按工号升序排序
df.sort_values(by='工号', inplace=True)
# 打印排序后的结果
print(df)

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出排序结果i。

code.python
>>> === RESTART: D:/Samples/ch03/1.py ==
     工号   部门   姓名                身份证号 性别
0  1001  财务部   陈东  5103211978100300**  男
1  1002  财务部   田菊  4128231980052512**  女
3  1003  生产部   王伟  4302251980031135**  男
4  1004  生产部   韦龙  4302251985111635**  男
5  1005  销售部   刘洋  4302251980081235**  男
6  1006  生产部   吕川  3203251970010171**  男
7  1007  销售部   杨莉  4201171973021753**  女
2  1008  财务部   夏东  1328011947050583**  男
8  1009  销售部   吴晓  4302251980011535**  男
9  1010  销售部  宋恩龙  3203251980010181**  男

【知识点扩展】

使用DataFrame对象的sort_values方法进行排序,用该方法的by参数指定排序依据,用ascending参数设置升序还是降序,其值为False时为降序,为True时为升序。默认时为升序排列。

多条件排序

【问题描述】

指定DataFrame中的多列数据作为排序依据,可以对各列数据单独指定排序方式。

【示例3-32】

本例使用示例3-30的数据。要求首先根据性别进行升序排序,然后对于相同性别的人员用工号进行升序排列。

  • 编写下面的代码:
code.python
import pandas as pd
# 读取Excel文件数据
df = pd.read_excel(r'D:/Samples/ch03/05 数据排序/多条件排序/身份证号-排序.xlsx',
                   sheet_name='Sheet1', engine='openpyxl', index_col=0)
# 按照性别和工号升序排序
df_sorted = df.sort_values(by=['性别', '工号'], ascending=True)
print(df_sorted)

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出多条件排序的结果。

code.python
>>> === RESTART: D:/Samples/ch03/1.py ==
       部门   姓名                身份证号 性别
工号
1002  财务部   田菊  4128231980052512**  女
1007  销售部   杨莉  4201171973021753**  女
1001  财务部   陈东  5103211978100300**  男
1003  生产部   王伟  4302251980031135**  男
1004  生产部   韦龙  4302251985111635**  男
1005  销售部   刘洋  4302251980081235**  男
1006  生产部   吕川  3203251970010171**  男
1008  财务部   夏东  1328011947050583**  男
1009  销售部   吴晓  4302251980011535**  男
1010  销售部  宋恩龙  3203251980010181**  男

可见,首先根据性别进行排序,然后对同一性别的人员按照工号进行了升序排列。

提取前3名

【问题描述】

对DataFrame中的数据进行排序后提取前N行或后N行。

【示例3-33】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/05 数据排序/提取前3名/前三名.xlsx”。该文件打开后如图3-23所示,是一些同学的短跑成绩。请给出短跑前3名的人员姓名、短跑成绩和名次。

Document Image

图3-23 学生短跑成绩

  • 编写下面的代码:
code.python
import pandas as pd
# 读取Excel文件
excel_file = pd.read_excel('D:/Samples/ch03/05 数据排序/提取前3名/前三名.xlsx', engine='openpyxl')
# 根据短跑成绩进行升序排序,用时越少排序越靠前
sorted_data = excel_file.sort_values('短跑成绩(秒)')
# 提取前3名的人员姓名、短跑成绩和名次
top_3 = sorted_data[['姓名', '短跑成绩(秒)']].head(3)
top_3['名次'] = [1, 2, 3]
print(top_3)

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出短跑前3名的姓名、成绩和名次。

code.python
>>> === RESTART: D:/Samples/ch03/1.py ==
   姓名  短跑成绩(秒)  名次
4  吴军       18   1
2  赵毅       19   2
3  张林       20   3